數學上,三維幾何是3維歐式空間幾何的傳統名稱。因爲實際上這大致就是我們生活的空間。
我們在前面介紹過向量運算,其中很多內容也適合三維幾何,如點+向量=點,向量+向量=向量,點+點沒有定義。
首先是輔助宏的定義:
const double eps = 1e-10;
const double PI = acos(-1); // π
const double TWO_PI = 2*PI;
const int maxn = 100 + 5;
const int INF = 10000;
三維點的定義:
struct Point3
{
double x, y, z;
Point3(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z){}
};
typedef Point3 Vector3;
向量操作:
Vector3 operator + (const Vector3 &A,const Vector3 &B)
{
return Vector3(A.x+B.x, A.y+B.y, A.z+B.z);
}
Vector3 operator - (const Vector3 &A,const Vector3 &B)
{
return Vector3(A.x-B.x, A.y-B.y, A.z-B.z);
}
Vector3 operator * (const Vector3 &A, double p)
{
return Vector3(A.x*p, A.y*p, A.z*p);
}
Vector3 operator / (const Vector3 &A, double p)
{
return Vector3(A.x/p, A.y/p, A.z/p);
}
bool operator == (const Vector3 &A,const Vector3 &B)
{
return (dcmp(A.x - B.x) == 0) && (dcmp(A.y - B.y) == 0) && (dcmp(A.z - B.z) == 0);
}
三維點積的定義和二維非常類似,而且也能用點積計算向量的長度和夾角。
double Dot(const Vector3 &A,const Vector3 &B)
{
return A.x*B.x + A.y*B.y + A.z*B.z;
}
向量的長度
double Length(const Vector3 &A)
{
return sqrt(Dot(A, A));
}
向量的夾角
double Angle(const Vector3 &A,const Vector3 &B)
{
return acos(Dot(A, B) / Length(A) / Length(B));
}
三維叉積:
三維空間裏也有叉積的概念,但形式和二維叉積大不一樣,它是一個向量,而不再是一個帶符號的數。
v1 * v2 =
y1z2 - y2z1
z1x2 - z2x1
x1y2 - x2y1
一種在學術上不太嚴謹的說法,可以認爲叉積同時垂直於v1和v2,方向遵循右手定則。當且僅當v1和v2平行時,叉積是0。
Vector3 Cross(const Vector3 &A,const Vector3 &B)
{
return Vector3(A.y*B.z - B.y*A.z, A.z*B.x - B.z*A.x, A.x*B.y - B.x*A.y);
}